package com.wanqing.mapper;


import com.github.pagehelper.Page;
import com.wanqing.annotation.AutoFill;
import com.wanqing.dto.BookPageQueryDTO;
import com.wanqing.entity.Book;
import com.wanqing.enumeration.OperationType;
import com.wanqing.vo.BookVO;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * BookMapper接口用于定义与图书相关的数据库操作
 */

@Mapper
public interface BookMapper {

    /**
     * 根据类别ID统计图书数量
     *
     * @param id 类别ID
     * @return 图书数量
     */
    @Select("select count(*) from book where category_id =#{id}")
    Integer countByCategoryId(Long id);

    /**
     * 根据图书ID获取图书信息
     *
     * @param id 图书ID
     * @return 图书信息
     */
    @Select("select * from book where id = #{id}")
    Book getById(Long id);

    /**
     * 根据图书ID统计书单中包含该图书的数量
     *
     * @param id 图书ID
     * @return 书单中包含该图书的数量
     */
    @Select("select count(id) from book_book_list where book_id =#{id}")
    Integer countByBookListId(Long id);


    /**
     * 保存图书信息，并自动填充创建时间、更新时间等字段
     *
     * @param book 图书对象
     */
    @AutoFill(OperationType.INSERT)
    @Insert("insert into book value (#{id},#{name},#{categoryId},#{price},#{image},#{description},#{stock},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser})")
    void save(Book book);

    /**
     * 分页查询图书信息
     *
     * @param bookPageQueryDTO 分页查询条件
     * @return 分页查询结果
     */
    Page<BookVO> pageQuery(BookPageQueryDTO bookPageQueryDTO);


    /**
     * 批量删除图书信息
     *
     * @param ids 图书ID列表
     */
    void deleteBatch(List<Long> ids);


    /**
     * 更新图书信息，并自动填充更新时间等字段
     *
     * @param book 图书对象
     */
    @AutoFill(OperationType.UPDATE)
    void update(Book book);

    /**
     * 根据类别ID获取图书列表
     *
     * @param categoryId 图书类别ID，用于筛选同一类别的图书
     * @return 返回一个Book对象列表，包含所有符合类别ID的图书
     */
    @Select("select * from book where category_id = #{categoryId} and status = 1")
    List<Book> getByCategoryId(Long categoryId);

    /**
     * 根据条件统计图书数量
     *
     * @param map
     * @return
     */
    Integer countByMap(Map map);

    /**
     * 查询图书库存量低于10的图书
     *
     * @return
     */
    @Select("select book.name,book.stock from book where stock <= 10")
    List<BookVO> bookStockWarning();

    /**
     * 查询所有缺货的图书
     *
     * @return
     */
    @Select("select * from book where stock = 0")
    List<Book> getOutOfStockBooks();

    /**
     * 根据图书名称查询图书
     *
     * @param name
     * @return
     */
    @Select("select * from book where name like concat('%',#{name},'%')")
    Book getByName(String name);
}
